package com.itheima.aop;

import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import com.itheima.utnil.CurrentHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;

/****
 * 1、创建日志表
 * 2、创建Pojo、Mapper
 * 3、定义切面类OperationLogAspect，切面类中定义环绕通知@Around
 * 4、在@Around中创建日志操作对象，并完善数据(赋值)   切入点表达式：execution || @annotation
 *      1）方法信息（方法名字、方法所在的类、方法参数、方法返回值、方法执行耗时）
 *      2）操作人（登录系统的用户-JWT令牌）
 * 5、将完善的日志对象添加到数据库中
 */
@Component
@Aspect
@Slf4j
public class OperationLogAspect {

    @Autowired
    private OperateLogMapper operateLogMapper;


//     * 定义切面类OperationLogAspect，切面类中定义环绕通知@Around
//拦截目标方法然后进入这个切面进行操作
    @Around("execution(* com.itheima.Controller.*.add*(..)) || execution(* com.itheima.Controller.*.update*(..)) || execution(* com.itheima.Controller.*.info*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable { //目标方法对象信息记录
        //开始时间,获取当前时间
        long start = System.currentTimeMillis();


//         * 在@Around中创建日志操作对象，并完善数据(赋值)   切入点表达式：execution || @annotation
//         *    1）方法信息（方法名字、方法所在的类、方法参数、方法返回值、方法执行耗时）
//         *    2）操作人（登录系统的用户-JWT令牌）

        OperateLog operateLog = new OperateLog();
//        返回值返回了数字
        //调用目标方法
        Object result = pjp.proceed();
        operateLog.setOperateEmpId(currentEmpId());
        operateLog.setOperateTime(LocalDateTime.now());
        operateLog.setClassName(pjp.getTarget().getClass().getName());
        operateLog.setMethodName(pjp.getSignature().getName());
        operateLog.setMethodParams(Arrays.toString(pjp.getArgs()));



        long end = System.currentTimeMillis();
        operateLog.setCostTime(end-start);
        operateLog.setReturnValue(result.toString());

        operateLogMapper.save(operateLog);
        return result;
    }


    /****
     * 获取员工ID
     */
    public int currentEmpId(){
        return CurrentHolder.getCurrentId();
    }

}
